#define _CRT_SECURE_NO_WARNINGS 1


#include <stdio.h>

//函数递归
//递归就是函数自己调用自己
//写一个史上最简单的递归

int main()
{
	printf("hehe\n");
	main();

	return 0;
}

/*
递归的思考方式就是把大事化小的过程
递归中的递就是递推的意思，归就是回归的意思

递归函数必须有以下两个条件：
1.递归存在限制条件，当满足这个限制条件的时候，递归便不再继续
2.每次递归调用之后越来越接近这个限制条件

*/
//求n的阶乘
//n的阶乘公式：n! = n *(n - 1)!
//0! = 1
//不考虑溢出的问题

//在c语言中，每一次函数调用，都要为这次函数调用
//在栈区申请一块内存空间，用来为这次函数调用存放信息
//这一块空间就叫:运行时堆栈  或者 函数栈帧空间


Fact(int n)
{
	if (0 == n)
		return 1;
	else
		return n * Fact(n - 1);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int a = Fact(n);
	printf("%d\n", a);

	return 0;
}

//打印1234

void Set(int n)
{
	if (n > 9)
		Set(n / 10);

	printf("%d ", n % 10);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	Set(n);

	return 0;
}

//递归的好处
//1.递归往往只允许少量的代码，就完成了大量的重复计算
//2.有些场景下递归代码写起来非常方便

//求第 n 个斐波那契数
// 1 1 2 3 5 8 13 21 .....
//前两个数的和等于第三个数

int count = 0;//查看计算量
int Fib(int n)
{
	if (n == 3)
		count++;
	if (n <= 2)
		return 1;
	else
		return Fib(n - 1) + Fib(n - 2);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int r = Fib(n);
	printf("%d\n", r);
	printf("count = %d", count);
	return 0;
}


//迭代方法

int Fib(int n)
{
	int a = 1;
	int b = 1;
	int c = 0;

	if (n <= 2)
		return 1;
	while (n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int r = Fib(n);
	printf("%d\n", r);
	return 0;
}